import eslint from '@eslint/js'
import globals from 'globals'
import typescriptEslint from 'typescript-eslint'
import eslintPluginVue from 'eslint-plugin-vue'
import eslintPluginPrettierRecommended from 'eslint-plugin-prettier/recommended'

/**
 * @type {import('eslint').Linter.Config[]}
 * @description 使用带有类型提示的 typescriptEslint.config()方法，可以获得eslint的类型提示
 *  */
export default typescriptEslint.config(
    /**
     * TypeScript、vue规则配置
     * 参考：https://eslint.vuejs.org/user-guide/
     */
    {
        // 这里不进行继承，在vue文件中无法解析到全局（在types中）定义的ts类型
        extends: [
            // JavaScript 推荐的规则
            eslint.configs.recommended,
            // ts推荐配置
            ...typescriptEslint.configs.recommended,
            // Vue规则配置
            ...eslintPluginVue.configs['flat/recommended'],
        ],
        files: ['**/*.{ts,tsx,vue}'],
        languageOptions: {
            ecmaVersion: 'latest',
            sourceType: 'module',
            // globals: globals.browser,
            parserOptions: {
                parser: typescriptEslint.parser,
            },
        },
        rules: {
            // ts规则配置
            '@typescript-eslint/no-explicit-any': 'off',
            '@typescript-eslint/prefer-ts-expect-error': 'off',
            // 在这里追加 vue 规则
            'vue/no-mutating-props': [
                'error',
                {
                    shallowOnly: true,
                },
            ],
        },
    },

    /**
     * JavaScript 自定义的规则
     */
    {
        rules: {
            // 'no-console': 'warn',
        },
    },

    /**
     * 配置全局变量
     */
    {
        languageOptions: {
            globals: {
                ...globals.browser,
                // 添加自定义的全局变量
                Cesium: true,
            },
        },
    },

    /**
     * prettier 配置
     * 会合并根目录下的prettier.config.js 文件
     * @see https://prettier.io/docs/en/options
     */
    eslintPluginPrettierRecommended,

    {
        settings: {
            /** 配置别名 */
            'import/resolver': {
                alias: [['@', './src']],
            },
        },
    },
    {
        // 自定义的忽略文件需要放到最后，否则容器被前面的规则给覆盖了
        // 默认eslit会去读取项目所有文件进行校验，所以我们需要在配置文件中使用ignores字段来告诉eslint排除哪些文件
        // 这里排除第三方依赖、静态文件
        ignores: ['node_modules', 'dist', 'public', 'src/assets'],
    },
)
